package com.zh.quartz.service;

import com.zh.quartz.jobs.HelloJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @author :fjw
 * @description:TODO
 * @date :2020/11/14 20:32
 */
@Service
public class JobService {
	/**
	 * 创建任务调度器
	 */
	public static Scheduler SCHEDULER;

	static {
		try {
			SCHEDULER = new StdSchedulerFactory().getScheduler();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}

	@Autowired
	private Scheduler scheduler;

	public static void main(String[] args) throws SchedulerException {
		/**通过JobBuilder.newJob()方法获取到当前Job的具体实现(以下均为链式调用)
		 * 这里是固定Job创建，所以代码写死XXX.class
		 * 如果是动态的，根据不同的类来创建Job，则 ((Job)Class.forName("com.zy.job.TestJob").newInstance()).getClass()
		 * 即是 JobBuilder.newJob(((Job)Class.forName("com.zy.job.TestJob").newInstance()).getClass())
		 * */
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
				/**
				 * 给当前JobDetail添加参数，K V形式,链式调用
				 * 在Job实现类中，可以通过jobExecutionContext.getJobDetail().getJobDataMap().get("age")获取值
				 */
				.usingJobData("name", "老王")
				.usingJobData("age", 23)
				/**添加认证信息，有3种重写的方法，我这里是其中一种，可以查看源码看其余2种*/
				.withIdentity("小王", "研发部")
				.build();//执行

		SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
				/**给当前JobDetail添加参数，K V形式，链式调用，
				 * 可以传入多个参数，在Job实现类中
				 * 可以通过jobExecutionContext.getTrigger().getJobDataMap().get("orderNo")获取值*/
				.usingJobData("orderNo", "123456")
				/**添加认证信息，有3种重写的方法，我这里是其中一种，可以查看源码看其余2种*/
				.withIdentity("大王", "实施部")
				/**立即执行*/
				.startNow()
				/**开始执行时间*/
				.startAt(new Date())
				/**结束执行时间,不写永久执行*/
				.endAt(new Date())
				/**添加执行规则，SimpleTrigger、CronTrigger的区别主要就在这里*/
				.withSchedule(SimpleScheduleBuilder.simpleSchedule()
						/**每隔3s执行一次,api方法有好多规则自行查看*/
						.withIntervalInSeconds(3)
						/**一直执行,如果不写,定时任务就执行一次*/
						.repeatForever()
				).build();//构建

		CronTrigger cronTrigger = TriggerBuilder.newTrigger()
				/**给当前JobDetail添加参数，K V形式，链式调用，可以传入多个参数，在Job实现类中，可以通过jobExecutionContext.getTrigger().getJobDataMap().get("orderNo")获取值*/
				.usingJobData("orderNo", "123456")
				/**添加认证信息，有3种重写的方法，我这里是其中一种，可以查看源码看其余2种*/
				.withIdentity("我是name", "我是group")
				/**立即生效*/
				//      .startNow()
				/**开始执行时间*/
				.startAt(new Date())
				/**结束执行时间,不写永久执行*/
				.endAt(new Date())
				/**添加执行规则，SimpleTrigger、CronTrigger的区别主要就在这里,我这里是demo，写了个每2分钟执行一次*/
				.withSchedule(CronScheduleBuilder.cronSchedule("0 0/2 * * * ?"))
				.build();//执行


		SCHEDULER.scheduleJob(jobDetail,simpleTrigger);
		if (!SCHEDULER.isShutdown()) {
			SCHEDULER.start();
		}
		//任务暂停
		SCHEDULER.pauseTrigger(TriggerKey.triggerKey("我是刚才写的name","我是刚才写的group"));

		//任务的恢复
		SCHEDULER.resumeTrigger(TriggerKey.triggerKey("我是刚才写的name","我是刚才写的group"));
		//任务的删除
		SCHEDULER.pauseTrigger(TriggerKey.triggerKey("我是刚才写的name","我是刚才写的group"));//暂停触发器
		SCHEDULER.unscheduleJob(TriggerKey.triggerKey("我是刚才写的name","我是刚才写的group"));//移除触发器
		SCHEDULER.deleteJob(JobKey.jobKey("我是刚才写的name","我是刚才写的group"));//删除Job
	}


}
